﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using GSQ.BusinessEntities;
using GSQ.DataAccess.DataSetTableAdapters;

namespace GSQ.DataAccess
{
    public class ComprasDA
    {
        #region Variables
        private COMPRASTableAdapter AdapterMaster = new COMPRASTableAdapter();
        private COMPRAS_DETALLESTableAdapter AdapterDetaill = new COMPRAS_DETALLESTableAdapter();

        private V_COMPRASTableAdapter vAdapterMaster = new V_COMPRASTableAdapter();
        private V_COMPRAS_DETALLESTableAdapter vAdapterDetaill = new V_COMPRAS_DETALLESTableAdapter();

        private SECUENCIASTableAdapter AdapterSecuencias = new SECUENCIASTableAdapter();
        private PRODUCTOSTableAdapter AdapterProductos = new PRODUCTOSTableAdapter();

        private DataSet.COMPRASDataTable entitiesMaster;
        private DataSet.COMPRAS_DETALLESDataTable entitiesDetaill;

        private DataSet.COMPRASRow entityMaster;
        private DataSet.COMPRAS_DETALLESRow entityDetaill;

        private DataSet.SECUENCIASRow entitySecuencia;
        #endregion

        public decimal Insert(COMPRAS value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open(); // abro la conexion
                    AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal

                    SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion
                    AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal

                    AdapterSecuencias.Connection = cnn; // Asigno la conexion a tableAdapter que maneja las secuencias
                    AdapterSecuencias.Transaction = tr; // Asigno la transaccion tableAdapter que maneja las secuencias

                    entitySecuencia = AdapterSecuencias.GetDataByID(1).FirstOrDefault(); // Obtengo el valor de secuencia en su tabla correspondiente
                    if (value.ID_CONDICION == 1)// Obtengo el valor de secuencia en su tabla correspondiente
                    {
                        SUPLIDORESTableAdapter adapterSuplidor = new SUPLIDORESTableAdapter { Connection = cnn, Transaction = tr };
                        DataSet.SUPLIDORESRow rwSuplidor = adapterSuplidor.GetDataByID(value.ID_SUPLIDOR).FirstOrDefault();
                        rwSuplidor.MONTO_ADEUDADO += value.M_TOTAL;
                        adapterSuplidor.Update(rwSuplidor);
                    }

                    entitiesMaster = new DataSet.COMPRASDataTable(); // Inicializo la tabla principal 
                    entityMaster = entitiesMaster.NewCOMPRASRow(); // Inicializo la fila principal apartir de la tabla principal


                    entityMaster.ID = entitySecuencia.VALUE + 1;// Asigno el valor de secuencia mas 1 
                    entityMaster.ID_CONDICION = value.ID_CONDICION;
                    entityMaster.TIPO = value.TIPO;
                    entityMaster.ID_USUARIO = value.ID_USUARIO;
                    entityMaster.FECHA = value.FECHA;
                    entityMaster.F_VENCIMIENTO = value.F_VENCIMIENTO;
                    entityMaster.ID_SUPLIDOR = value.ID_SUPLIDOR;
                    entityMaster.NRO_FACTURA = value.NRO_FACTURA;
                    if (value.NCF != null && value.NCF != string.Empty)
                        entityMaster.NCF = value.NCF;
                    if (value.OBSERVACIONES != null && value.OBSERVACIONES != string.Empty)
                        entityMaster.OBSERVACIONES = value.OBSERVACIONES;
                    entityMaster.ACTIVO = value.ACTIVO;
                    entityMaster.T_DESCUENTO = value.T_DESCUENTO;
                    entityMaster.T_IMPUESTO = value.T_IMPUESTO;
                    entityMaster.M_PAGADO = value.M_PAGADO;
                    entityMaster.M_TOTAL = value.M_TOTAL;

                    entitiesMaster.AddCOMPRASRow(entityMaster); //Agrego la fila principal a la tabla principal
                    try
                    {
                        AdapterMaster.Update(entitiesMaster); // Ejecuto la operacion de update para insertar el encabezado 

                        AdapterSecuencias.SecuenciasUpdateCommand(1); // Ejecuto la operacion para actualizar la secuencia 

                        AdapterDetaill.Connection = cnn; // Asigno la conexion al tableAdapter de detalle 
                        AdapterDetaill.Transaction = tr; // Asigno la transaccion al tableAdapter de detalle


                        DataSet.UTILIDADESRow utilidades = new DataSetTableAdapters.UTILIDADESTableAdapter { Connection = cnn, Transaction = tr }.GetData().FirstOrDefault();

                        AdapterProductos.Connection = cnn;
                        AdapterProductos.Transaction = tr;

                        entitiesDetaill = new DataSet.COMPRAS_DETALLESDataTable();
                        foreach (COMPRAS_DETALLES rw in value.COMPRAS_DETALLES)
                        {
                            entityDetaill = entitiesDetaill.NewCOMPRAS_DETALLESRow();

                            AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);
                            DataSet.PRODUCTOSRow producto = AdapterProductos.GetDataByID(rw.ID_PRODUCTO).FirstOrDefault();
                            entityDetaill.COSTO_ANTERIOR = producto.COSTO;
                            entityDetaill.PRECIO_ANTERIOR = producto.PRECIO;
                            if (utilidades.AJUSTAR_PRECIOS_COSTO_COMPRAS)
                            {
                                producto.COSTO = rw.COSTO;
                                producto.PRECIO = rw.COSTO + ((rw.COSTO * producto.X_GANANCIA) / 100);
                                AdapterProductos.Update(producto);
                            }

                            entityDetaill.ID = entityMaster.ID;
                            entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
                            entityDetaill.CANTIDAD = rw.CANTIDAD;
                            entityDetaill.COSTO = rw.COSTO;
                            entityDetaill.PRECIO = rw.PRECIO;
                            entityDetaill.DESCUENTO = rw.DESCUENTO;
                            entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
                            entityDetaill.IMPUESTO = rw.IMPUESTO;
                            entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
                            entityDetaill.C_DEVUELTA = rw.C_DEVUELTA;
                            entitiesDetaill.AddCOMPRAS_DETALLESRow(entityDetaill);
                        }
                        AdapterDetaill.Update(entitiesDetaill);
                        tr.Commit();
                    }
                    catch (Exception ex)
                    {
                        tr.Rollback();
                        throw ex;
                    }

                    value.ID = entityMaster.ID;
                    return value.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public decimal Update(COMPRAS newValue, COMPRAS oldValue)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open(); // abro la conexion
                    AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal

                    SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion
                    AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal

                    entitiesMaster = this.AdapterMaster.GetDataByID(oldValue.ID);
                    entityMaster = this.entitiesMaster.FirstOrDefault(); // Inicializo la fila principal apartir de la tabla principal

                    entityMaster.ID_CONDICION = newValue.ID_CONDICION;
                    entityMaster.TIPO = newValue.TIPO;
                    entityMaster.ID_USUARIO = newValue.ID_USUARIO;
                    entityMaster.FECHA = newValue.FECHA;
                    entityMaster.F_VENCIMIENTO = newValue.F_VENCIMIENTO;
                    entityMaster.ID_SUPLIDOR = newValue.ID_SUPLIDOR;
                    entityMaster.NRO_FACTURA = newValue.NRO_FACTURA;
                    if (newValue.NCF != null && newValue.NCF != string.Empty)
                        entityMaster.NCF = newValue.NCF;
                    if (newValue.OBSERVACIONES != null && newValue.OBSERVACIONES != string.Empty)
                        entityMaster.OBSERVACIONES = newValue.OBSERVACIONES;
                    entityMaster.ACTIVO = newValue.ACTIVO;
                    entityMaster.T_DESCUENTO = newValue.T_DESCUENTO;
                    entityMaster.T_IMPUESTO = newValue.T_IMPUESTO;
                    entityMaster.M_PAGADO = newValue.M_PAGADO;
                    entityMaster.M_TOTAL = newValue.M_TOTAL;

                    try
                    {
                        if (oldValue.ID_CONDICION == 1 && oldValue.ACTIVO)// restar el monto pendiente del suplidor
                        {
                            SUPLIDORESTableAdapter adapterSuplidor = new SUPLIDORESTableAdapter { Connection = cnn, Transaction = tr };
                            DataSet.SUPLIDORESRow rwSuplidor = adapterSuplidor.GetDataByID(oldValue.ID_SUPLIDOR).FirstOrDefault();
                            rwSuplidor.MONTO_ADEUDADO -= oldValue.M_TOTAL;
                            adapterSuplidor.Update(rwSuplidor);
                        }

                        if (newValue.ID_CONDICION == 1)// sumar el monto pendiente del suplidor
                        {
                            SUPLIDORESTableAdapter adapterSuplidor = new SUPLIDORESTableAdapter { Connection = cnn, Transaction = tr };
                            DataSet.SUPLIDORESRow rwSuplidor = adapterSuplidor.GetDataByID(newValue.ID_SUPLIDOR).FirstOrDefault();

                            rwSuplidor.MONTO_ADEUDADO += newValue.M_TOTAL;
                            adapterSuplidor.Update(rwSuplidor);
                        }

                        AdapterMaster.Update(entitiesMaster); // Ejecuto la operacion de update para insertar el encabezado 

                        AdapterDetaill.Connection = cnn; // Asigno la conexion al tableAdapter de detalle 
                        AdapterDetaill.Transaction = tr; // Asigno la transaccion al tableAdapter de detalle                        

                        DataSet.UTILIDADESRow utilidades = new DataSetTableAdapters.UTILIDADESTableAdapter { Connection = cnn, Transaction = tr }.GetData().FirstOrDefault();

                        AdapterProductos.Connection = cnn;
                        AdapterProductos.Transaction = tr;


                        DataSet.COMPRAS_DETALLESDataTable comprasDetalles = AdapterDetaill.GetDataByID(oldValue.ID);
                        foreach (DataSet.COMPRAS_DETALLESRow r in comprasDetalles)
                        {
                            AdapterProductos.ProductosUpdateExistencia((r.CANTIDAD * -1), r.ID_PRODUCTO);
                        }
                        AdapterDetaill.DeleteByID(oldValue.ID);
                        entitiesDetaill = new DataSet.COMPRAS_DETALLESDataTable();

                        foreach (COMPRAS_DETALLES rw in newValue.COMPRAS_DETALLES)
                        {
                            entityDetaill = entitiesDetaill.NewCOMPRAS_DETALLESRow();
                            AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);
                            DataSet.PRODUCTOSRow producto = AdapterProductos.GetDataByID(rw.ID_PRODUCTO).FirstOrDefault();
                            entityDetaill.COSTO_ANTERIOR = producto.COSTO;
                            entityDetaill.PRECIO_ANTERIOR = producto.PRECIO;
                            if (utilidades.AJUSTAR_PRECIOS_COSTO_COMPRAS)
                            {
                                producto.COSTO = rw.COSTO;
                                producto.PRECIO = rw.COSTO + ((rw.COSTO * producto.X_GANANCIA) / 100);
                                AdapterProductos.Update(producto);
                            }



                            entityDetaill.ID = entityMaster.ID;
                            entityDetaill.ID_PRODUCTO = rw.ID_PRODUCTO;
                            entityDetaill.CANTIDAD = rw.CANTIDAD;
                            entityDetaill.COSTO = rw.COSTO;
                            entityDetaill.PRECIO = rw.PRECIO;
                            entityDetaill.DESCUENTO = rw.DESCUENTO;
                            entityDetaill.X_DESCUENTO = rw.X_DESCUENTO;
                            entityDetaill.IMPUESTO = rw.IMPUESTO;
                            entityDetaill.X_IMPUESTO = rw.X_IMPUESTO;
                            entityDetaill.C_DEVUELTA = rw.C_DEVUELTA;
                            entitiesDetaill.AddCOMPRAS_DETALLESRow(entityDetaill);
                        }
                        AdapterDetaill.Update(entitiesDetaill);
                        tr.Commit();
                    }
                    catch (Exception ex)
                    {
                        tr.Rollback();
                        throw ex;
                    }

                    newValue.ID = entityMaster.ID;
                    return newValue.ID;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public COMPRAS GetById(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;

                    DataSet.V_COMPRASRow rw = vAdapterMaster.GetDataByID(id).FirstOrDefault();
                    COMPRAS compras = null;
                    if (rw != null)
                    {
                        vAdapterDetaill.Connection = cnn;
                        compras = GetEntity(rw, vAdapterDetaill.GetDataByID(rw.ID));
                    }
                    return compras;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COMPRAS> GetAll()
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COMPRAS> list = new List<COMPRAS>();
                    foreach (DataSet.V_COMPRASRow rw in vAdapterMaster.GetData())
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COMPRAS> GetByFechas(DateTime value1, DateTime value2)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COMPRAS> list = new List<COMPRAS>();
                    foreach (DataSet.V_COMPRASRow rw in vAdapterMaster.GetDataByFechas(value1.Date, value2.Date))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COMPRAS> GetBySuplidor(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COMPRAS> list = new List<COMPRAS>();
                    foreach (DataSet.V_COMPRASRow rw in vAdapterMaster.GetDataByIdSuplidor(id))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COMPRAS> GetBySuplidor(string value)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COMPRAS> list = new List<COMPRAS>();
                    foreach (DataSet.V_COMPRASRow rw in vAdapterMaster.GetDataBySuplidor(value.Trim()))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public List<COMPRAS> GetByNroFactura(string nroFactura)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.vAdapterMaster.Connection = cnn;
                    List<COMPRAS> list = new List<COMPRAS>();
                    foreach (DataSet.V_COMPRASRow rw in vAdapterMaster.GetDataByNroFactura(nroFactura))
                    {
                        list.Add(GetEntity(rw, null));
                    }
                    return list;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public bool ValidarEnvioNcf(decimal idSuplidor, string ncf)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.AdapterMaster.Connection = cnn;

                    int i = (int)AdapterMaster.CountByIdSuplidorNcf(idSuplidor, ncf.Trim());

                    if (i > 0)
                        return true;
                    else
                        return false;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public bool ValidarEnvioNroFactura(decimal idSuplidor, string nroFactura)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open();
                    this.AdapterMaster.Connection = cnn;

                    int i = (int)AdapterMaster.CountByIdSuplidorNroFactura(idSuplidor, nroFactura.Trim());

                    if (i > 0)
                        return true;
                    else
                        return false;
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public void AplicarCompra(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open(); // abro la conexion
                    AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal
                    AdapterDetaill.Connection = cnn;// asignar la conexion al tableAdapter de detalle

                    AdapterProductos.Connection = cnn;

                    SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion

                    AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal
                    AdapterDetaill.Transaction = tr; // Asigno  la transaccion al tableAdapter de detalle
                    AdapterProductos.Transaction = tr;

                    this.entityMaster = AdapterMaster.GetDataByID(id).FirstOrDefault();

                    if (this.entityMaster != null)
                    {
                        if (!this.entityMaster.ACTIVO)
                        {
                            try
                            {
                                if (entityMaster.ID_CONDICION == 1)// sumar el monto pendiente del suplidor
                                {
                                    SUPLIDORESTableAdapter adapterSuplidor = new SUPLIDORESTableAdapter { Connection = cnn, Transaction = tr };
                                    DataSet.SUPLIDORESRow rwSuplidor = adapterSuplidor.GetDataByID(entityMaster.ID_SUPLIDOR).FirstOrDefault();
                                    rwSuplidor.MONTO_ADEUDADO += entityMaster.M_TOTAL;
                                    adapterSuplidor.Update(rwSuplidor);
                                }
                                foreach (DataSet.COMPRAS_DETALLESRow rw in AdapterDetaill.GetDataByID(id))
                                {
                                    AdapterProductos.ProductosUpdateExistencia(rw.CANTIDAD, rw.ID_PRODUCTO);
                                }
                                this.entityMaster.ACTIVO = true;
                                AdapterMaster.Update(this.entityMaster);
                                tr.Commit();
                            }
                            catch
                            {
                                tr.Rollback();
                                throw;
                            }
                        }
                        else
                        {
                            throw new ArgumentException(string.Format("Compra {0}  ya está aplicada a inventario", id));
                        }
                    }
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        public void DesaplicarCompra(decimal id)
        {
            using (SqlConnection cnn = new SqlConnection(Connection.GetConnectionString))
            {
                try
                {
                    cnn.Open(); // abro la conexion
                    AdapterMaster.Connection = cnn; // asignar la conexion al tableAdapter principal
                    AdapterDetaill.Connection = cnn;// asignar la conexion al tableAdapter de detalle

                    AdapterProductos.Connection = cnn;

                    SqlTransaction tr = cnn.BeginTransaction(); // Creo la transaccion y la inicializo con la conexion

                    AdapterMaster.Transaction = tr; // Asigno  la transaccion al tableAdapter principal
                    AdapterDetaill.Transaction = tr; // Asigno  la transaccion al tableAdapter de detalle
                    AdapterProductos.Transaction = tr;

                    this.entityMaster = AdapterMaster.GetDataByID(id).FirstOrDefault();

                    if (this.entityMaster != null)
                    {
                        if (this.entityMaster.ACTIVO)
                        {
                            try
                            {
                                if (entityMaster.ID_CONDICION == 1)// restar el monto pendiente del suplidor
                                {
                                    SUPLIDORESTableAdapter adapterSuplidor = new SUPLIDORESTableAdapter { Connection = cnn, Transaction = tr };
                                    DataSet.SUPLIDORESRow rwSuplidor = adapterSuplidor.GetDataByID(entityMaster.ID_SUPLIDOR).FirstOrDefault();
                                    rwSuplidor.MONTO_ADEUDADO -= entityMaster.M_TOTAL;
                                    adapterSuplidor.Update(rwSuplidor);
                                }

                                foreach (DataSet.COMPRAS_DETALLESRow rw in AdapterDetaill.GetDataByID(id))
                                {
                                    AdapterProductos.ProductosUpdateExistencia((rw.CANTIDAD * -1), rw.ID_PRODUCTO);
                                }
                                this.entityMaster.ACTIVO = false;
                                AdapterMaster.Update(this.entityMaster);
                                tr.Commit();
                            }
                            catch
                            {
                                tr.Rollback();
                                throw;
                            }
                        }
                        else
                        {
                            throw new ArgumentException(string.Format("Compra {0} ya está desaplicada", id));
                        }
                    }
                }
                finally
                {
                    if (cnn.State != System.Data.ConnectionState.Closed)
                        cnn.Close();
                }
            }
        }

        private COMPRAS GetEntity(DataSet.V_COMPRASRow rwMaster, DataSet.V_COMPRAS_DETALLESDataTable tdDetaill)
        {
            COMPRAS compra = null;
            if (rwMaster != null)
            {
                compra = new COMPRAS();
                compra.ID = rwMaster.ID;
                compra.ID_CONDICION = rwMaster.ID_CONDICION;
                compra.CONDICIONES = new CONDICIONES { ID = rwMaster.ID_CONDICION, CONDICION = rwMaster.CONDICION };
                compra.TIPO = rwMaster.TIPO;
                compra.ID_USUARIO = rwMaster.ID_USUARIO;
                compra.USUARIOS = new USUARIOS { ID = rwMaster.ID_USUARIO, NOMBRE_USUARIO = rwMaster.USUARIO };
                compra.FECHA = rwMaster.FECHA;
                compra.F_VENCIMIENTO = rwMaster.F_VENCIMIENTO;
                compra.ID_SUPLIDOR = rwMaster.ID_SUPLIDOR;
                compra.SUPLIDORES = new SUPLIDORES { ID = rwMaster.ID_SUPLIDOR, SUPLIDOR = rwMaster.SUPLIDOR };
                compra.NRO_FACTURA = rwMaster.NRO_FACTURA;
                if (!rwMaster.IsNCFNull())
                    compra.NCF = rwMaster.NCF;
                if (!rwMaster.IsOBSERVACIONESNull())
                    compra.OBSERVACIONES = rwMaster.OBSERVACIONES;
                compra.ACTIVO = rwMaster.ACTIVO;
                compra.M_PAGADO = rwMaster.M_PAGADO;
                compra.M_TOTAL = rwMaster.M_TOTAL;
                compra.T_DESCUENTO = rwMaster.T_DESCUENTO;
                compra.T_IMPUESTO = rwMaster.T_IMPUESTO;

                if (tdDetaill != null)
                {
                    foreach (DataSet.V_COMPRAS_DETALLESRow rw in tdDetaill)
                    {
                        if (rw != null)
                        {
                            COMPRAS_DETALLES compradetalle = new COMPRAS_DETALLES();
                            compradetalle.ID = rw.ID;
                            compradetalle.ID_PRODUCTO = rw.ID_PRODUCTO;
                            compradetalle.PRODUCTOS = new PRODUCTOS { ID = rw.ID_PRODUCTO, CODIGO = rw.CODIGO };
                            compradetalle.MEDIDAS = new MEDIDAS { ID = rw.ID_MEDIDA, MEDIDA = rw.MEDIDA };
                            compradetalle.DESCRIPCIONES = new DESCRIPCIONES { ID = rw.ID_DESCRIPCION, DESCRIPCION = rw.DESCRIPCION };
                            compradetalle.CANTIDAD = rw.CANTIDAD;
                            compradetalle.COSTO = rw.COSTO;
                            compradetalle.COSTO_ANTERIOR = rw.COSTO_ANTERIOR;
                            compradetalle.PRECIO_ANTERIOR = rw.PRECIO_ANTERIOR;
                            compradetalle.PRECIO = rw.PRECIO;
                            compradetalle.DESCUENTO = rw.DESCUENTO;
                            compradetalle.X_DESCUENTO = rw.X_DESCUENTO;
                            compradetalle.IMPUESTO = rw.IMPUESTO;
                            compradetalle.X_IMPUESTO = rw.X_IMPUESTO;
                            compradetalle.C_DEVUELTA = rw.C_DEVUELTA;
                            compra.COMPRAS_DETALLES.Add(compradetalle);
                        }
                    }

                }
            }
            return compra;
        }
    }
}
